/*
给你一个仅由大写英文字母组成的字符串，你可以将任意位置上的字符替换成另外的字符，总共可最多替换 k 次。在执行上述操作后，找到包含重复字母的最长子串的长度。

注意：字符串长度 和 k 不会超过 104。

 

示例 1：

输入：s = "ABAB", k = 2
输出：4
解释：用两个'A'替换为两个'B',反之亦然。
示例 2：

输入：s = "AABABBA", k = 1
输出：4
解释：
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/longest-repeating-character-replacement
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

#include "stdc++.h"

/* 滑动窗口
滑动窗口范围内的数量最多的字母个数
剩下的都可以替换
*/
class Solution {
public:
    int characterReplacement(string s, int k) {
        vector<int> nums(26, 0); // 滑动窗口内字母个数表
        int n = s.size();
        int right{0};
        int left{0};
        int maxN{0};
        while (right < n) {
            ++nums[s[right] - 'A'];
            maxN = max(maxN, nums[s[right] - 'A']);
            if (right - left + 1 - maxN > k) {
                --nums[s[left] - 'A'];
                ++left;
            }
            ++right;
        }
        return right - left;
    }
};